﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaDocRG
    {
        #region Variaveis Membro
        private int _idRg;
        private int _idPessoa;
        private string _numero;
        private string _orgaoEmissor;
        private Uf _uf;
        private DateTime _dataExpedicao;
        private string _path;
        private GENTEEntities _context;
        #endregion

        #region Parametros
        public int IdRg
        {
            get { return _idRg; }
            set { _idRg = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public string Numero
        {
            get { return _numero; }
            set { _numero = value; }
        }
        public string OrgaoEmissor
        {
            get { return _orgaoEmissor; }
            set { _orgaoEmissor = value; }
        }
        public Uf Uf
        {
            get { return _uf; }
            set { _uf = value; }
        }
        public DateTime DataExpedicao
        {
            get { return _dataExpedicao; }
            set { _dataExpedicao = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        #endregion

        #region Construtores
        public PessoaDocRG()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaDocRG(int idRg)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idRg);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        protected void Carregar(int idRg)
        {
            try
            {
                var consulta = from rg in _context.tab_pessoa_rg
                               where rg.id_rg == idRg
                               select new
                               {
                                   rg.id_rg,
                                   rg.tab_pessoa.Id_pessoa,
                                   rg.numero_rg,
                                   rg.orgao_emissor,
                                   rg.tab_uf.id_uf,
                                   rg.dt_expedicao,
                                   rg.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdRg = list.id_rg;
                    this.IdPessoa = list.Id_pessoa;
                    this.Numero = list.numero_rg;
                    this.OrgaoEmissor = list.orgao_emissor;
                    this.Uf = new Uf(list.id_uf);
                    this.DataExpedicao = list.dt_expedicao;
                    this.Path = list.path;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from rg in _context.tab_pessoa_rg
                               where rg.tab_pessoa.Id_pessoa == this.IdPessoa
                               && rg.numero_rg == this.Numero
                               && rg.orgao_emissor == this.OrgaoEmissor
                               && rg.dt_expedicao == this.DataExpedicao
                               orderby rg.id_rg descending
                               select rg;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdRg = list.id_rg;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaDocRG> SelectAll()
        {
            try
            {
                List<PessoaDocRG> listPessoaDocRG = new List<PessoaDocRG>();

                var consulta = from rg in _context.tab_pessoa_rg
                               orderby rg.id_rg descending
                               select new
                               {
                                   rg.id_rg,
                                   rg.tab_pessoa.Id_pessoa,
                                   rg.numero_rg,
                                   rg.orgao_emissor,
                                   rg.tab_uf.id_uf,
                                   rg.dt_expedicao,
                                   rg.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocRG rg = new PessoaDocRG();
                    rg.IdRg = list.id_rg;
                    rg.IdPessoa = list.Id_pessoa;
                    rg.Numero = list.numero_rg;
                    rg.OrgaoEmissor = list.orgao_emissor;
                    rg.Uf = new Uf(list.id_uf);
                    rg.DataExpedicao = list.dt_expedicao;
                    rg.Path = list.path;

                    listPessoaDocRG.Add(rg);
                }

                return listPessoaDocRG;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaDocRG> SelectPorPessoa(int idPessoa)
        {
            try
            {
                List<PessoaDocRG> listPessoaDocRG = new List<PessoaDocRG>();

                var consulta = from rg in _context.tab_pessoa_rg
                               where rg.tab_pessoa.Id_pessoa == idPessoa
                               orderby rg.id_rg descending
                               select new
                               {
                                   rg.id_rg,
                                   rg.tab_pessoa.Id_pessoa,
                                   rg.numero_rg,
                                   rg.orgao_emissor,
                                   rg.tab_uf.id_uf,
                                   rg.dt_expedicao,
                                   rg.path
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaDocRG rg = new PessoaDocRG();
                    rg.IdRg = list.id_rg;
                    rg.IdPessoa = list.Id_pessoa;
                    rg.Numero = list.numero_rg;
                    rg.OrgaoEmissor = list.orgao_emissor;
                    rg.Uf = new Uf(list.id_uf);
                    rg.DataExpedicao = list.dt_expedicao;
                    rg.Path = list.path;

                    listPessoaDocRG.Add(rg);
                }

                return listPessoaDocRG;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            if (this.IdRg == 0)
            {
                tab_pessoa_rg tabRg = new tab_pessoa_rg();

                tabRg.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                tabRg.numero_rg = this.Numero;
                tabRg.orgao_emissor = this.OrgaoEmissor;
                tabRg.tab_ufReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_uf", "id_uf", this.Uf.IdUf);
                tabRg.dt_expedicao = this.DataExpedicao;

                _context.AddTotab_pessoa_rg(tabRg);
                _context.SaveChanges();

                RecuperaId();
            }
            else
            {
                tab_pessoa_rg tabRg = (from rg in _context.tab_pessoa_rg
                                       where rg.id_rg == this.IdRg
                                       select rg).First();

                tabRg.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                tabRg.numero_rg = this.Numero;
                tabRg.orgao_emissor = this.OrgaoEmissor;
                tabRg.tab_ufReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_uf", "id_uf", this.Uf.IdUf);
                tabRg.dt_expedicao = this.DataExpedicao;

                _context.SaveChanges();
            }
        }
        public void AtualizaPath()
        {
            try
            {
                if (this.IdRg != 0)
                {
                    tab_pessoa_rg tabRg = (from rg in _context.tab_pessoa_rg
                                           where rg.id_rg == this.IdRg
                                           select rg).First();

                    tabRg.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
